/*
 * ２点を結んだ直線の角度を求める
 */
#include <common.h>
#include "spec.h"
#include "math.h"

/*
========================================
  ２点を結んだ直線の角度を求める
  引き数：float stX, float stY, float eX, float eY
        stX : 始点のＸ座標
        stY : 始点のＹ座標
        eX  : 終点のＸ座標
        eY  : 終点のＹ座標
  戻り値：direct_t 角度
========================================
 */
direct_t
PointMakeDir(float stX, float stY, float eX, float eY)
{
  float difX,difY;
  float tmp;
  float ll;
  int   syougen;

  tmp = stX;
  stX = -stY;
  stY = tmp;

  tmp = eX;
  eX = -eY;
  eY = tmp;

  /* */
  difX = abs(stX - eX);
  difY = abs(stY - eY);
  /* ２点間の距離 */
  ll = sqrt(difX * difX + difY * difY);
  /* sin theta = y / l より、sin theta を求める */
  tmp = difY / ll;
  /* 始点を正規化する */
  difX = eX - stX;
  difY = eY - stY;
  /* 終点の象現を判定する */
    if(difX > 0 && difY > 0)
      syougen = 1;
  else
    if(difX < 0 && difY > 0)
      syougen = 2;
  else
    if(difX < 0 && difY < 0)
      syougen = 3;
  else
    if(difX > 0 && difY < 0)
      syougen = 4;
  else
    if(difX == 0 && difY > 0)
      syougen = 2;
  else
    if(difX == 0 && difY < 0)
      syougen = 4;
  else
    if(difX > 0 && difY == 0)
      syougen = 1;
  else
    if(difX < 0 && difY == 0)
      syougen = 3;
  return asin(abs(tmp),syougen);
}

/*
----------------------------------------
  アークサインを求める
  PointMakeDir 専用 特殊な使い方なので
  普通のソースには使わないでください。
  引き数：float tmp, int syougen
        tmp アークサインを求める時の引き数
        syougen 象現
  戻り値：direct_t 角度（近似値）
----------------------------------------
 */
direct_t
asin(float tmp,int syougen)
{
  float  answer;
  int   i;

  switch(syougen){
    case 1:
      for(i = 0; i < 900; i++){
        answer = sintbl[i];
        if(tmp < answer){
          break;
        }
      }
      break;
    case 2:
      for(i = 900; i < 1800; i++){
        answer = sintbl[i];
        if(tmp > answer){
          break;
        }
      }
      break;
    case 3:
      for(i = 1800; i < 2700; i++){
        answer = sintbl[i];
        if(tmp < abs(answer)){
          break;
        }
      }
      break;
    case 4:
      for(i = 2700; i < 3600; i++){
        answer = sintbl[i];
        if(tmp > abs(answer)){
          break;
        }
      }
      break;
    default:
      i = 0;
      break;
  }
  return i;
}
